import BaseVenueProcessor from './BaseVenueProcessor.js';
import { getAiDongJinFengVenueSettings } from '../request.js';

/**
 * 爱动金丰网球俱乐部场地数据处理器
 */
export class AiDongJinFengProcessor extends BaseVenueProcessor {
  constructor() {
    super();
    this.venueName = '爱动金丰网球俱乐部';
  }

  /**
   * 获取爱动金丰网球俱乐部场地预约设置
   * @param {Object} params - 查询参数 { userId, projectUid, dateTime }
   * @returns {Promise} 请求Promise
   */
  async getVenueSettings(params = {}) {
    // 设置默认参数
    const defaultParams = {
      userId: 5554966,
      projectUid: "0",
      dateTime: "2025-08-13"
    };
    
    // 合并参数
    const requestData = { ...defaultParams, ...params };
    
    return await getAiDongJinFengVenueSettings(requestData);
  }

  /**
   * 验证数据是否有效
   * @param {Object} data - 原始场地数据
   * @returns {boolean} 数据是否有效
   */
  validateData(data) {
    // 爱动金丰数据结构包含顶层的slots和validClassRooms，以及result.slots
    return data && 
           ((data.result && data.result.slots && Array.isArray(data.result.slots)) ||
            (data.result.slots && Array.isArray(data.result.slots))) &&
           data.result.validClassRooms && Array.isArray(data.result.validClassRooms);
  }

  /**
   * 按场地名称分组
   * @param {Object} data - 原始场地数据
   * @returns {Map} 场地Map
   */
  groupVenues(data) {
    const venueMap = new Map();
    
    // 使用validClassRooms创建场地Map
    if (data.result && data.result.validClassRooms && Array.isArray(data.result.validClassRooms)) {
      data.result.validClassRooms.forEach(classroom => {
        venueMap.set(classroom.name, {
          name: classroom.name,
          uid: classroom.uid,
          timeSlots: []
        });
      });
    }
    
    return venueMap;
  }

  /**
   * 计算每小时价格
   * @param {Object} slot - 时间槽数据
   * @returns {number} 每小时价格
   */
  getHourlyPrice(slot) {
    const totalPrice = slot.realCost || slot.cost || slot.price || 0;
    const gapMinutes = slot.gapMinutes || 60; // 默认60分钟
    const hours = gapMinutes / 60;
    return Math.round(totalPrice / hours);
  }

  /**
   * 处理时间槽
   * @param {Map} venueMap - 场地Map
   * @param {Object} data - 原始场地数据
   */
  processTimeSlots(venueMap, data) {
    // 优先使用result.slots，如果没有则使用顶层的slots
    const slots = data.result && data.result.slots || (data.result && data.result.slots && Array.isArray(data.result.slots)) || [];
    
    // 遍历slots数组
    slots.forEach(slot => {
      // 根据classRoomName找到对应的场地
      const venue = venueMap.get(slot.classRoomName);
      
      if (venue) {
        // 添加时间槽信息
        venue.timeSlots.push({
          time: this.formatTime(slot.beginDatetime), // 格式化时间
          isFree: slot.status === 0, // status为0则可预约
          price: this.getHourlyPrice(slot), // 使用计算出的每小时价格
          beginDatetime: slot.beginDatetime,
          endDatetime: slot.endDatetime,
          classroomUid: slot.classroomUid
        });
      }
    });
  }

  /**
   * 格式化时间
   * @param {string} datetime - 日期时间字符串
   * @returns {string} 格式化后的时间
   */
  formatTime(datetime) {
    if (!datetime) return '';
    
    // iOS设备日期格式兼容处理
    const formatDateForIOS = (dateStr) => {
      // 如果已经是ISO格式或包含"/"，则直接使用
      if (dateStr.includes('T') || dateStr.includes('/')) {
        return dateStr;
      }
      
      // 将"yyyy-MM-dd HH:mm:ss"格式转换为"yyyy/MM/dd HH:mm:ss"格式以兼容iOS
      return dateStr.replace(/-/g, '/');
    };
    
    const date = new Date(formatDateForIOS(datetime));
    const hours = date.getHours();
    let minutes = date.getMinutes();
    
    // 规范化分钟数：0-14分钟显示为00，15-44分钟显示为30，45-59分钟显示为下一小时的00
    if (minutes >= 45) {
      return `${(hours + 1).toString().padStart(2, '0')}:00`;
    } else if (minutes >= 15) {
      minutes = 30;
    } else {
      minutes = 0;
    }
    
    return `${hours.toString().padStart(2, '0')}:${minutes.toString().padStart(2, '0')}`;
  }

  /**
   * 转换为场地列表
   * @param {Map} venueMap - 场地Map
   * @returns {Array} 场地列表
   */
  convertToVenueList(venueMap) {
    return Array.from(venueMap.values()).map((venue, index) => {
      // 根据场地名称设置不同的地址
      let address = '东莞市南城区金丰路88号';
      
      // 计算场地的平均价格（基于实际时间槽价格）
      let averagePrice = 0;
      if (venue.timeSlots && venue.timeSlots.length > 0) {
        const totalPrice = venue.timeSlots.reduce((sum, slot) => sum + (slot.price || 0), 0);
        averagePrice = Math.round(totalPrice / venue.timeSlots.length);
      }
      
      return {
        id: 9000 + index, // 给爱动金丰网球俱乐部场地分配ID
        name: venue.name,
        address: address,
        latitude: 23.0234,
        longitude: 113.7567,
        phone: '0769-45678901',
        rating: 4.7,
        price: averagePrice, // 使用计算出的平均价格
        facilities: ['室内场地', '专业教练', '器材租赁', '更衣室', '淋浴间'],
        image: '',
        distance: 9.2,
        timeSlots: venue.timeSlots,
        dataSource: this.venueName,
        uid: venue.uid
      };
    });
  }

  /**
   * 处理场地数据的主方法
   * @param {Object} data - 原始场地数据
   * @returns {Array} 处理后的场地列表
   */
  process(data) {
    // 验证数据
    if (!this.validateData(data)) {
      console.error('爱动金丰网球俱乐部数据格式不正确');
      return [];
    }
    
    // 按场地名称分组
    const venueMap = this.groupVenues(data);
    console.log("Aidong-venueMap",venueMap);
    
    // 处理时间槽
    this.processTimeSlots(venueMap, data);
    
    // 转换为场地列表
    return this.convertToVenueList(venueMap);
  }
}

export default AiDongJinFengProcessor;